package com.openlogic.common.datasource.config;

import org.noear.solon.annotation.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mybatisflex.core.FlexGlobalConfig;
import com.mybatisflex.core.audit.AuditManager;
import com.openlogic.common.core.web.domain.BaseEntity;
import com.openlogic.common.datasource.audit.AuditMessageFactory;
import com.openlogic.common.datasource.impl.DomainInsertListenerImpl;
import com.openlogic.common.datasource.impl.DomainUpdateListenerImpl;

/**
* @ClassName: MybatisFlexConfig
* @Description: Mybatis-Flex配置（在每个微服务的配置文件中还有全局配置）
* @author weiyongpeng
* @date 2025年1月31日 上午8:19:03
 */
@Configuration
public class MybatisFlexConfig {

    private static final Logger log = LoggerFactory.getLogger("mybatis-flex-sql");
    
    public MybatisFlexConfig() {
        globalConfig();
        sqlLog();
    }

    /**
    * 描述：全局配置
    * @Title: globalConfig
    * @author weiyongpeng
    * @date  2025年1月31日 上午8:19:13
     */
    private void globalConfig() {
        FlexGlobalConfig globalConfig = FlexGlobalConfig.getDefaultConfig();
        // 注册 insertListener
        globalConfig.registerInsertListener(new DomainInsertListenerImpl<>(), BaseEntity.class);
        // 注册 updateListener
        globalConfig.registerUpdateListener(new DomainUpdateListenerImpl<>(), BaseEntity.class);
    }
    
    /**
    * 描述：myBatis-flex自定义方言
    * @Title: openLogicDialectFactory
    * @param properties
    * @author weiyongpeng
    * @date  2025年1月31日 上午8:18:20
     */
//    @Bean
//    public void openLogicDialectFactory(@Inject TableProperties properties) {
//    	// 注册sql条件追加器
//        // DialectFactory.registerDialect(DbType.MYSQL, new OpenLogicCommonsDialectImpl(properties));
//    }

    /**
     * SQL打印
     */
    private void sqlLog() {
        // 开启审计功能（SQL打印分析的功能是使用 SQL审计模块完成的）
        AuditManager.setAuditEnable(true);
        AuditManager.setMessageFactory(new AuditMessageFactory());

        // 设置 SQL审计收集器
        AuditManager.setMessageCollector(auditMessage ->
           log.info("操作人:【{}】, SQL:【{}】, \n总条数:【{}】, 执行参数: 【{}】, 耗时:【{}ms】",auditMessage.getUser(), auditMessage.getFullSql(), auditMessage.getQueryCount(), auditMessage.getQueryParams(), auditMessage.getElapsedTime())
        );
    }
    
}
